home *** CD-ROM | disk | FTP | other *** search
/ Game Cracker (Expanded Edition) / Game Cracker (Expanded Edition).iso / cracks / SV_DDUNG.ZIP / Deathtrap Dungeon.txt < prev    next >
Text File  |  1998-08-22  |  16KB  |  334 lines

  1.  
  2. Free Information Xchange '98 presents:
  3.  
  4. Deathtrap Dungeon - CD crack by Static Vengeance
  5.  
  6. Requirements:
  7. Hex editor and full game install
  8. W32Dasm if you wish to follow along
  9.  
  10.     Deathtrap Dungeon is a great action adventure game much like Tomb Raider in game play.  However
  11. there is a little bug in the game that needs to be FiX'ed.  The bug I'm speaking of is the CD check that
  12. is run before and during the game.  So we will be removing the CD checks so the game can be run completly
  13. from the hard drive.  The first thing that's needs to be done, is to do a full install and look at the
  14. files that were copied to the hard drive in the install directory.  I saw ddconfig.exe, ddstart.exe and
  15. a DLL called dungeon.dll with other files and a subdirectory called asylum.  However, the three files I
  16. mentioned by name are the most interesting to us now.  The first file I disassembled was ddstart.exe to
  17. see what it did and to see if there were any CD checks in that file.  Sure enough. there is a CD check in
  18. there, however the exe program then runs the dd_cd.exe file from x:\asylum\ off the CD, "x" being your CD
  19. drive letter.  Well I figured as long as it's going to get run, why not copy it to the install directory
  20. and run it as the startup program for Deathtrap Dungeon.  Well it worked, except for the CD check.  So
  21. I disassembled the file, looking for the CD check, and found this:
  22.  
  23. * Referenced by a CALL at Addresses:
  24. |:004011A5   , :004011D7                                      <-- Called twice
  25. |
  26. :00401220 53                      push ebx
  27.  
  28. * Possible StringData Ref from Data Obj ->"X:\"               <-- Drive letter
  29.                                   |
  30. :00401221 6820614000              push 00406120
  31. :00401226 8A5C240C                mov bl, byte ptr [esp+0C]
  32. :0040122A 881D20614000            mov byte ptr [00406120], bl
  33.  
  34. * Reference To: KERNEL32.GetDriveTypeA, Ord:00DEh             <-- Commonly used in CD checks
  35.                                   |
  36. :00401230 FF1598914000            Call dword ptr [00409198]
  37. :00401236 83F805                  cmp eax, 00000005           <-- Value for a CD rom drive
  38. :00401239 752C                    jne 00401267                <-- Failed checks goto 401267
  39.  
  40. * Possible StringData Ref from Data Obj ->"rb"                <-- Read Binary
  41.                                   |
  42. :0040123B 6808614000              push 00406108
  43. :00401240 881D0C614000            mov byte ptr [0040610C], bl
  44.  
  45. * Possible StringData Ref from Data Obj ->"X:\Asylum\DD_CD.EXE"  <-- Check for this file
  46.                                   |
  47. :00401246 680C614000              push 0040610C
  48. :0040124B E8F0000000              call 00401340
  49. :00401250 83C408                  add esp, 00000008
  50. :00401253 85C0                    test eax, eax
  51. :00401255 7410                    je 00401267
  52. :00401257 50                      push eax
  53. :00401258 E843000000              call 004012A0
  54. :0040125D 83C404                  add esp, 00000004
  55. :00401260 B801000000              mov eax, 00000001           <-- Set return value for passed CD check
  56. :00401265 5B                      pop ebx
  57. :00401266 C3                      ret
  58.  
  59. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  60. |:00401239(C), :00401255(C)
  61. |
  62. :00401267 33C0                    xor eax, eax                <-- Zero out eax for a failed CD check
  63. :00401269 5B                      pop ebx
  64. :0040126A C3                      ret
  65.  
  66.     Well that's the code that checks for dd_cd.exe file on the CD.  So now it's time to check the
  67. code that calls the above routine:
  68.  
  69. :004011A5 E876000000              call 00401220        <-- Do the CD check
  70. :004011AA 83C404                  add esp, 00000004
  71. :004011AD 85C0                    test eax, eax        <-- Test the results
  72. :004011AF 7416                    je 004011C7          <-- Take this jump on fail (eax=zero)
  73.  
  74.     The other section of code that calls the CD check looks like this:
  75.  
  76. :004011D7 E844000000              call 00401220        <-- Do the CD check
  77. :004011DC 83C404                  add esp, 00000004
  78. :004011DF 85C0                    test eax, eax        <-- Test the results
  79. :004011E1 7512                    jne 004011F5         <-- Take this jump on pass (eax not equal to zero)
  80.  
  81.     The file dd_cd.exe is very small and uses calls to the dungeon.dll to run the game.  This
  82. can be seen by checking the import module section of the disassembly text.  Like this:
  83.  
  84.    Import Module 004: Dungeon.dll                                         <-- Module name
  85.  
  86.  Addr:000092CA hint(0001) Name: Config_Set_CD_Drive                       <-- Set the CD drive
  87.  Addr:000092E0 hint(0003) Name: Read_Default_Values_From_Config_File      <-- You get the idea!
  88.  Addr:0000927C hint(0005) Name: _W95_Serve_Message@16
  89.  Addr:00009294 hint(0004) Name: W95_Set_Message_Loop_Caller
  90.  Addr:000092B2 hint(0002) Name: Play_Win32_Deathtrap                      <-- Play the game!
  91.  
  92.     And a little snippet from the dd_cd.exe disassembly would show you this:
  93.  
  94.    --- Code ---
  95. :004010CA 52                      push edx
  96. :004010CB 50                      push eax
  97. :004010CC 51                      push ecx
  98.  
  99. * Reference To: Dungeon.Play_Win32_Deathtrap, Ord:0002h    <-- Says it all right here
  100.                                   |
  101. :004010CD E8A6010000              Call 00401278
  102. :004010D2 83C414                  add esp, 00000014
  103.  
  104. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  105. |:004010AF(C)
  106. |
  107. :004010D5 33C0                    xor eax, eax             <-- Getting here means you quit the game
  108. :004010D7 81C4D8010000            add esp, 000001D8
  109. :004010DD C3                      ret
  110.  
  111.     Well, now simply delete the old ddstart.exe file and then rename dd_cd.exe to ddstart.exe and
  112. your set, right?  Well... actualy no.  There are more CD checks, eight to be exact, but these are
  113. made from within the dungeon.dll itself and can be found by searching for the string "Insert the
  114. Deathtrap Dungeon CD into drive %c:" from the Data String References.  This would put you into the
  115. middle of code simular to this:
  116.  
  117. :1000F3DA E821100300              call 10040400             <-- Minor utility call used a LOT!
  118. :1000F3DF 85C0                    test eax, eax             <-- Test eax for a value
  119. :1000F3E1 0F852C010000            jne 1000F513              <-- Take this jump to bypass the CD check
  120.  
  121. * Possible StringData Ref from Data Obj ->"-:\A.DAT"        <-- File on the CD to check for
  122.                                   |
  123. :1000F3E7 8B0DE08A0F10            mov ecx, dword ptr [100F8AE0]
  124. :1000F3ED 33FF                    xor edi, edi
  125. :1000F3EF A0F08A0F10              mov al, byte ptr [100F8AF0]
  126. :1000F3F4 8801                    mov byte ptr [ecx], al
  127.  
  128. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  129. |:1000F50D(C)
  130. |
  131.  
  132. * Possible StringData Ref from Data Obj ->"rb"              <-- Read Binary
  133.                                   |
  134. :1000F3F6 6894D00B10              push 100BD094
  135.  
  136. * Possible StringData Ref from Data Obj ->"-:\A.DAT"        <-- The file (pointer to it)
  137.                                   |
  138. :1000F3FB A1E08A0F10              mov eax, dword ptr [100F8AE0]
  139. :1000F400 50                      push eax
  140. :1000F401 E8BAC30900              call 100AB7C0
  141. :1000F406 83C408                  add esp, 00000008
  142. :1000F409 8BE8                    mov ebp, eax
  143. :1000F40B 85ED                    test ebp, ebp
  144. :1000F40D 742B                    je 1000F43A
  145. :1000F40F 53                      push ebx
  146. :1000F410 6800C07326              push 2673C000
  147. :1000F415 55                      push ebp
  148. :1000F416 E875C50900              call 100AB990
  149. :1000F41B 83C40C                  add esp, 0000000C
  150. :1000F41E 55                      push ebp
  151. :1000F41F E82CC50900              call 100AB950
  152. :1000F424 83C404                  add esp, 00000004
  153. :1000F427 83F84A                  cmp eax, 0000004A
  154. :1000F42A 7505                    jne 1000F431
  155. :1000F42C BF01000000              mov edi, 00000001          <-- Set the flag for pass/fail
  156.  
  157. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  158. |:1000F42A(C)
  159. |
  160. :1000F431 55                      push ebp
  161. :1000F432 E8A9C20900              call 100AB6E0
  162. :1000F437 83C404                  add esp, 00000004
  163.  
  164. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  165. |:1000F40D(C)
  166. |
  167. :1000F43A 85FF                    test edi, edi                <-- if edi is 00000001 the CD check passed
  168. :1000F43C 0F85D1000000            jne 1000F513                 <-- Take this jump for passed CD check
  169.  
  170. * Possible StringData Ref from Data Obj ->"Insert the Deathtrap Dungeon CD "  <-- Why we're doing this
  171.                                         ->"into drive %c:"
  172.                                   |
  173. :1000F442 8B0DF48A0F10            mov ecx, dword ptr [100F8AF4]
  174. :1000F448 8D542414                lea edx, dword ptr [esp+14]
  175. :1000F44C 0FBE05F08A0F10          movsx eax, byte ptr [100F8AF0]
  176. :1000F453 50                      push eax
  177. :1000F454 51                      push ecx
  178. :1000F455 52                      push edx
  179. :1000F456 E855C40900              call 100AB8B0
  180. :1000F45B 83C40C                  add esp, 0000000C
  181. :1000F45E 8B2D848C0F10            mov ebp, dword ptr [100F8C84]
  182. :1000F464 C70550DC0D1001000000    mov dword ptr [100DDC50], 00000001
  183. :1000F46E 85ED                    test ebp, ebp
  184. :1000F470 7405                    je 1000F477
  185. :1000F472 E8E9110700              call 10080660
  186.  
  187. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  188. |:1000F470(C)
  189. |
  190. :1000F477 E8442F0700              call 100823C0
  191. :1000F47C 53                      push ebx
  192. :1000F47D A134DC0D10              mov eax, dword ptr [100DDC34]
  193. :1000F482 50                      push eax
  194.  
  195. * Reference To: USER32.ShowWindow, Ord:022Ch
  196.                                   |
  197. :1000F483 FF153C253510            Call dword ptr [1035253C]
  198. :1000F489 68007F0000              push 00007F00
  199. :1000F48E 53                      push ebx
  200.  
  201. * Reference To: KERNEL32.GetModuleHandleA, Ord:00FDh
  202.                                   |
  203. :1000F48F FF15E8243510            Call dword ptr [103524E8]
  204. :1000F495 50                      push eax
  205.  
  206. * Reference To: USER32.LoadCursorA, Ord:0172h
  207.                                   |
  208. :1000F496 FF1570253510            Call dword ptr [10352570]
  209. :1000F49C 50                      push eax
  210.  
  211. * Reference To: USER32.SetCursor, Ord:01EBh
  212.                                   |
  213. :1000F49D FF1520253510            Call dword ptr [10352520]
  214. :1000F4A3 6A01                    push 00000001
  215.  
  216. * Reference To: USER32.ShowCursor, Ord:0228h
  217.                                   |
  218. :1000F4A5 FF1518253510            Call dword ptr [10352518]
  219. :1000F4AB 8D442414                lea eax, dword ptr [esp+14]
  220. :1000F4AF 6835200000              push 00002035
  221.  
  222. * Possible StringData Ref from Data Obj ->"Deathtrap Dungeon"
  223.                                   |
  224. :1000F4B4 6878F80B10              push 100BF878
  225. :1000F4B9 50                      push eax
  226. :1000F4BA 53                      push ebx
  227.  
  228. * Reference To: USER32.MessageBoxA, Ord:0195h
  229.                                   |
  230. :1000F4BB FF1538253510            Call dword ptr [10352538]
  231. :1000F4C1 83F802                  cmp eax, 00000002                <-- 02 means you hit cancel
  232. :1000F4C4 750E                    jne 1000F4D4
  233.  
  234. * Possible StringData Ref from Data Obj ->"Original CD not found"  <-- Bad news for the user
  235.                                   |
  236. :1000F4C6 A1F88A0F10              mov eax, dword ptr [100F8AF8]
  237. :1000F4CB 50                      push eax
  238. :1000F4CC E85FC60100              call 1002BB30
  239. :1000F4D1 83C404                  add esp, 00000004
  240.  
  241. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  242. |:1000F4C4(C)
  243. |
  244. :1000F4D4 6A03                    push 00000003
  245. :1000F4D6 A134DC0D10              mov eax, dword ptr [100DDC34]
  246. :1000F4DB 50                      push eax
  247. :1000F4DC 891D50DC0D10            mov dword ptr [100DDC50], ebx
  248.  
  249. * Reference To: USER32.ShowWindow, Ord:022Ch
  250.                                   |
  251. :1000F4E2 FF153C253510            Call dword ptr [1035253C]
  252. :1000F4E8 E8030D0700              call 100801F0
  253. :1000F4ED 85ED                    test ebp, ebp
  254. :1000F4EF 7405                    je 1000F4F6
  255. :1000F4F1 E84A110700              call 10080640
  256.  
  257. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  258. |:1000F4EF(C)
  259. |
  260. :1000F4F6 6A01                    push 00000001
  261. :1000F4F8 53                      push ebx
  262. :1000F4F9 68E0010000              push 000001E0
  263. :1000F4FE 6880020000              push 00000280
  264. :1000F503 E8A88A0400              call 10057FB0
  265. :1000F508 83C410                  add esp, 00000010
  266. :1000F50B 85FF                    test edi, edi
  267. :1000F50D 0F84E3FEFFFF            je 1000F3F6                <-- Go back up and try again
  268.  
  269. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  270. |:1000F3E1(C), :1000F43C(C)                                  <-- Two possible ways to get here
  271. |
  272. :1000F513 E8A83A0000              call 10012FC0              <-- Getting here continues the game
  273. :1000F518 E8B3070700              call 1007FCD0
  274. :1000F51D 85C0                    test eax, eax
  275. :1000F51F 740A                    je 1000F52B
  276. :1000F521 C644241101              mov [esp+11], 01
  277. :1000F526 E947030000              jmp 1000F872
  278.  
  279.     Alright, there you have it.  There are 4 files on the CD called a.dat, b.dat, c.dat and d.dat
  280. each takes up 615 megs.  Basicly each file takes up the whole CD and you would not copy 2460 megs to
  281. your hard drive to run the game.  So the easiest way to defeat this check is force the conditional
  282. jump at 1000F3E1 to always be taken.  This way the check for the file is never even run and the program
  283. jumps right down to the continue section.  I wanted to make a single patch in the 10040400 routine, but
  284. it is called so many times by other routines I didn't know what kind of impact a patch there would make.
  285. So we'll need to change the call 10040400 at 1000F3DA to mov eax, 00000001.  Now when run, the code will
  286. always take the jne at 1000F3E1 and the game will continue to play.  You'll also need to the same thing
  287. for the other 7 checks during the game.  I made the edits and played the game for bit without problems.
  288. Everything seems to work, like setting options, loading and saving of games.  So this one is done.
  289. The entire process to crack Deathtrap Dungeon is:
  290.  
  291. 1.  Do a full install including the "Full Motion Videos"
  292. 2.  Copy dd_cd.exe to the Deathtrap driectory
  293. 3.  Delete ddstart.exe
  294. 4.  Rename dd_cd.exe to ddstart.exe
  295. 5.  Make the following edits:
  296.  
  297. Edit ddstart.exe (was dd_cd.exe)
  298. ===========================================
  299. Search for: E8 76 00 00 00  at offset 1,445
  300. Change to : B8 01 00 00 00
  301.  
  302. Search for: E8 44 00 00 00  at offset 1,495
  303. Chagne to : B8 01 00 00 00
  304.  
  305. Edit dungeon.dll
  306. =============================================
  307. Search for: E8 21 10 03 00  at offset  59,354
  308. Change to : B8 01 00 00 00
  309.  
  310. Search for: E8 DA 04 03 00  at offset  62,241
  311. Change to : B8 01 00 00 00
  312.  
  313. Search for: E8 87 FE 02 00  at offset  63,860
  314. Change to : B8 01 00 00 00
  315.  
  316. Search for: E8 D6 C4 02 00  at offset  78,629
  317. Change to : B8 01 00 00 00
  318.  
  319. Search for: E8 FE BE 02 00  at offset  80,125
  320. Change to : B8 01 00 00 00
  321.  
  322. Search for: E8 B8 12 FC FF  at offset 517,443
  323. Change to : B8 01 00 00 00
  324.  
  325. Search for: E8 A1 08 FC FF  at offset 520,026
  326. Change to : B8 01 00 00 00
  327.  
  328. Search for: E8 8A FC FB FF  at offset 523,121
  329. Change to : B8 01 00 00 00
  330.  
  331.     While the CD checking was a bit more involved, Deathtrap Dungeon is now FiX'ed
  332.  
  333. Static Vengeance
  334.